﻿namespace hercules.Models.Negocio
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    using hercules.Models.Dados;

    /// <summary>
    /// Classe responsável pela lógica de negócio dos produtos.
    /// </summary>
    public class NegocioProduto 
    {
        /// <summary>
        /// Objeto genérico que faz a persistência dos dados.
        /// </summary>
        private readonly IRepositorioGenerico<Produto, ControleEstoqueEntities> repositorioProduto;

        /// <summary>
        /// Initializes a new instance of the <see cref="NegocioProduto"/> class.
        /// Construtor para inicializar os atributos.
        /// </summary>
        public NegocioProduto()
        {
            this.repositorioProduto = new RepositorioGenerico<Produto, ControleEstoqueEntities>("chave");
        }

        /// <summary>
        /// Método para fazer a inserção de produto.
        /// </summary>
        /// <param name="produto">Objeto que irá ser persistido</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Inserir(Produto produto)
        {
            this.repositorioProduto.Inserir(produto);
            return this.repositorioProduto.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para fazer a alteração de produto.
        /// </summary>
        /// <param name="objeto">Objeto que terá seus dados alterados</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Editar(Produto objeto)
        {
            Produto produto = this.Obter(objeto.idProduto);
            produto.nome = objeto.nome;
            produto.codigoBarra = objeto.codigoBarra;
            produto.dataVencimento = objeto.dataVencimento;
            produto.descontoMaximo = objeto.descontoMaximo;
            produto.apelido = objeto.apelido;
            produto.icms = objeto.icms;
            produto.ipi = objeto.ipi;
            produto.lote = objeto.lote;
            produto.naturezaCFOP = objeto.naturezaCFOP;
            produto.ncm = objeto.ncm;
            produto.precoNota = objeto.precoNota;
            produto.precoReal = objeto.precoReal;
            produto.precoVenda = objeto.precoVenda;
            produto.unidade = objeto.unidade;

            return this.repositorioProduto.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para remover um produto utilizando o código do produto.
        /// </summary>
        /// <param name="codProduto">Código do produto que será removido.</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Remover(int codProduto)
        {
            this.repositorioProduto.Remover(produto => produto.idProduto == codProduto);
            return this.repositorioProduto.SaveChanges() > 0;
        }

        /// <summary>
        /// Método que retorna uma lista com todos os produtos.
        /// </summary>
        /// <returns>A lista com os produtos.</returns>
        public List<Produto> ObterTodos()
        {
            return this.repositorioProduto.ObterTodos().ToList();
        }

        /// <summary>
        /// Método que retorna um produto passando o código desse produto.
        /// </summary>
        /// <param name="codProduto">Código do produto a ser retornado.</param>
        /// <returns>O produto desejado.</returns>
        public Produto Obter(int codProduto)
        {
            return this.repositorioProduto.ObterEntidade(produto => produto.idProduto == codProduto);
        }

        /// <summary>
        /// Método para fazer a comparação entre dois produtos.
        /// </summary>
        /// <param name="produto1">Primeiro produto.</param>
        /// <param name="produto2">Segundo produto.</param>
        /// <returns>True se eles forem iguais, caso contrário false.</returns>
        public bool Equals(Produto produto1, Produto produto2)
        {
            if (produto1.idProduto.Equals(produto2.idProduto) &&
                produto1.codigoBarra.Equals(produto2.codigoBarra) &&
                produto1.naturezaCFOP.Equals(produto2.naturezaCFOP) &&
                produto1.nome.Equals(produto2.nome) &&
                produto1.apelido.Equals(produto2.apelido) &&
                produto1.ncm.Equals(produto2.ncm) &&
                produto1.precoNota.Equals(produto2.precoNota) &&
                produto1.precoReal.Equals(produto2.precoReal) &&
                produto1.ipi.Equals(produto2.ipi) &&
                produto1.unidade.Equals(produto2.unidade) &&
                produto1.icms.Equals(produto2.icms) &&
                produto1.precoVenda.Equals(produto2.precoVenda) &&
                produto1.descontoMaximo.Equals(produto2.descontoMaximo) &&
                produto1.dataVencimento.Equals(produto2.dataVencimento) &&
                produto1.lote.Equals(produto2.lote))
            {
                return true;
            }

            return false;
        }
    }
}